wayland/vulkancontext: Fix present region on HiDPI
authorJonas Ådahl <jadahl@gmail.com>
Tue, 3 Dec 2019 15:42:03 +0000 (16:42 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Tue, 3 Dec 2019 15:45:37 +0000 (16:45 +0100)
VkPresentRegionsKHR is expected to operate in buffer coordinates, but
the region we get passed is in surface coordinates, so it must be scaled.

gdk/gdkvulkancontext.c

index 247e6e094fe906ba4b4b2f44d2560c146bc8a6cb..5582afeb92224247320f413397aa409039571579 100644 (file)
@@ -441,11 +441,14 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context,
 {
   GdkVulkanContext *context = GDK_VULKAN_CONTEXT (draw_context);
   GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
+  GdkSurface *surface = gdk_draw_context_get_surface (draw_context);
   VkPresentRegionsKHR *regionsptr = VK_NULL_HANDLE;
   VkPresentRegionsKHR regions;
   cairo_rectangle_int_t extents;
+  int scale;
 
   cairo_region_get_extents (painted, &extents);
+  scale = gdk_surface_get_scale_factor (surface);
 
   regions = (VkPresentRegionsKHR) {
       .sType = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR,
@@ -454,10 +457,10 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context,
           .rectangleCount = 1,
           .pRectangles = &(VkRectLayerKHR) {
               .layer = 0,
-              .offset.x = extents.x,
-              .offset.y = extents.y,
-              .extent.width = extents.width,
-              .extent.height = extents.height,
+              .offset.x = extents.x * scale,
+              .offset.y = extents.y * scale,
+              .extent.width = extents.width * scale,
+              .extent.height = extents.height * scale,
           }
       },
   };